package com.serviportales.contactenos.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.serviportales.contactenos.model.Mensaje;
import com.serviportales.serviportales.dao.GenericHibernateDAO;
import com.serviportales.serviportales.utils.BeansUtils;

@Repository
public class MensajeDAO extends GenericHibernateDAO<Mensaje> {

	private static final long serialVersionUID = 1L;

	@Override
	public DetachedCriteria getBasicDetachedCriteria(Mensaje mensaje) {
		DetachedCriteria criteria = DetachedCriteria.forClass(Mensaje.class);

		if (mensaje.getMotivoContacto() != null) {
			if (mensaje.getMotivoContacto().getNombre() != null) {
				criteria = criteria.add(Restrictions.ilike("motivoContacto.nombre", mensaje.getMotivoContacto().getCodigo(), MatchMode.ANYWHERE));
			}
		}
		if (mensaje.getNombre() != null) {
			criteria = criteria.add(Restrictions.ilike("nombre", mensaje.getNombre(), MatchMode.ANYWHERE));
		}
		return criteria;
	}

	public Mensaje selectByID(Serializable codigo) {
		return getHibernateTemplate().get(Mensaje.class, codigo);
	}

	@SuppressWarnings("unchecked")
	public List<Mensaje> selectMensajesNotLobs(Mensaje mensaje) {
		String strQuery = "select new Mensaje(mensaje.scMensaje, " + //
				"mensaje.motivoContacto.codigo, " + //
				"mensaje.motivoContacto.nombre, " + //
				"mensaje.nombre," + //
				"mensaje.email, " + //
				"mensaje.telefono, " + //
				"mensaje.celular, " + //
				"mensaje.nombreAdjunto, " + //
				"mensaje.extensionAdjunto, " + //
				"mensaje.mensaje, " + //
				"mensaje.respuesta," + //
				"mensaje.estadoMensaje.codigo) " + //
				"from Mensaje as mensaje ";
		if (mensaje != null) {
			String where = "";
			if (mensaje.getMotivoContacto() != null && !BeansUtils.isEmpty(mensaje.getMotivoContacto().getCodigo())) {
				where += "mensaje.motivoContacto.codigo = :motivoContactoCodigo ";
			}
			if (mensaje.getEstadoMensaje() != null && !BeansUtils.isEmpty(mensaje.getEstadoMensaje().getCodigo())) {
				where += "mensaje.estadoMensaje.codigo = :estadoMensaje ";
			}
			if (!BeansUtils.isEmpty(mensaje.getNombre())) {
				where += "upper(mensaje.nombre) like upper(:nombre) ";
			}
			if (!where.isEmpty()) {
				strQuery += "where " + where;
			}
		}

		Query query = getSession().createQuery(strQuery);
		if (mensaje != null) {
			if (mensaje.getMotivoContacto() != null && !BeansUtils.isEmpty(mensaje.getMotivoContacto().getCodigo())) {
				query.setString("motivoContactoCodigo", mensaje.getMotivoContacto().getCodigo());
			}
			if (mensaje.getEstadoMensaje() != null && !BeansUtils.isEmpty(mensaje.getEstadoMensaje().getCodigo())) {
				query.setString("estadoMensaje", mensaje.getEstadoMensaje().getCodigo());
			}
			if (!BeansUtils.isEmpty(mensaje.getNombre())) {
				query.setString("nombre", "%" + mensaje.getNombre() + "%");
			}
		}
		return query.list();
	}
}
